/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function (temperatures) {
  //数组长度
  let m = temperatures.length
  //结果数组res：下一个升温日的索引
  let res = new Array(m).fill(0)
  /*栈：
    1. 存放索引。
    2. 索引对应的温度是从栈底到栈顶递减的。*/
  let stack = []
  /*遍历温度数组：
    1.当前温度大于栈顶所指的温度，说明找到了栈顶元素的“升温日”
    2.一直这样处理，直到栈为空或当前温度不再大于栈顶温度。
    3.然后把当前索引入栈。*/
  for (let i = 0; i < m; i++) {
    while (stack.length && temperatures[i] > temperatures[stack[stack.length - 1]]) {
      // 栈顶元素出栈、计算索引差、存入结果数组
      let stackTop_index = stack.pop()
      let index_gap = i - stackTop_index
      res[stackTop_index] = index_gap
    }
    //当前元素入栈
    stack.push(i)
  }

  //返回结果数组
  return res
};